RT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<assert.h>

using std::cout;
using std::endl;

//class Date
//{
//public:
//	void Init(int year, int month, int day)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	void Print()
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	Date d1, d2;
//	d1.Init(2022, 5, 15);
//	d1.Print();
//
//	d2.Init(2022, 5, 20);
//	d2.Print();
//	return 0;
//}


//class Stack
//{
//public:
//	Stack(int capacity=10)
//	{
//		int* _a = (int*)malloc(sizeof(int) * capacity);
//		assert(_a);
//		//_top = 0;
//		_capacity = capacity;
//	}
//	void push()
//	{}
//	void pop()
//	{}
////private:
//	int* _a;
//	int _top;
//	int _capacity;
//};
//
//class Date
//{
//public:
//
//	//全缺省默认构造函数
//	Date(int year=2022,int month=5, int day=20)
//	{
//		//_year = year;
//		//_month = month;
//		_day = day;
//	}
//
//	void Print()
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//		cout << st._capacity << "-" << st._top << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//	Stack st;
//};
//int main()
//{
//	//Date d1; // 调用无参构造函数
//	//Date d2(2022,5,15); // 调用带参的构造函数
//
//	Date d3;
//	//d1.Print();
//	//d2.Print();
//	// 
//	d3.Print();
//	// 注意：如果通过无参构造函数创建对象时，对象后面不用跟括号，否则就成了函数声明
//	// 以下代码的函数：声明了d3函数，该函数无参，返回一个日期类型的对象
//	//Date d3();
//	return 0;
//}


//class Stack
//{
//public:
//	Stack(int capacity=10)
//	{
//		int* _a = (int*)malloc(sizeof(int) * capacity);
//		assert(_a);
//		_top = 3;
//		_capacity = capacity;
//	}
//	void push()
//	{}
//	void pop()
//	{}
////private:
//	int* _a;
//	int _top;
//	int _capacity;
//};
//
//class Date
//{
//public:
//
//	//全缺省默认构造函数
//	Date(int year = 2022, int month = 5, int day = 20)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	Date(const Date& d)
//	{
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//
//	void Print()
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//		//cout << st._capacity << "-" << st._top << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//	Stack st;
//};
//int main()
//{
//	//Date d1; // 调用无参构造函数
//	//Date d2(2022,5,15); // 调用带参的构造函数
//	Date d3;
//	Date d4(d3);
//	//d1.Print();
//	//d2.Print();
//	d3.Print();
//	d4.Print();
//	return 0;
//}




//// 全局的operator==
//class Date
//{
//public:
//	Date(int year = 1900, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	//但是在类里面为了不调用拷贝构造且不改变
//	//就加上const和& 
//	//const Date& d1, const Date& d2
//	// 但是因为有this这个隐藏参数，就省略第一个
//	//下面参数其实应该是
//	//Date* const this     const Date& d
//	bool operator==(const Date& d) {
//		cout << "class" << endl;
//		return _year == d._year    //左边省略了this 
//			&& this->_month == d._month  //应该是 this->_year
//			&& _day == d._day;
//	}
//
//	bool operator=(const Date& d) {
//		this->_year = d._year;
//		this->_month = d._month;
//		this->_day = d._day;
//	}
//
//	void Print()
//	{
//		cout << _year << endl;
//		cout << _month << endl;
//		cout << _day << endl;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//// 这里会发现运算符重载成全局的就需要成员变量是共有的，那么问题来了，封装性如何保证？
//// 这里其实可以用我们后面学习的友元解决，或者干脆重载成成员函数。
////bool operator==(const Date& d1, const Date& d2) {
////	cout << "global" << endl;
////	return d1._year == d2._year
////	&& d1._month == d2._month
////		&& d1._day == d2._day;
////}
//
//int main()
//{
//	Date d1(2018, 9, 26);
//	Date d2(2018, 9, 26);
//
//	//cout << d1.operator==(d2) << endl;
//	//cout << (d1 == d2) << endl;
//
//	Date d3(d1);
//	d3.Print();
//	return 0;
//}


// 全局的operator==
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//但是在类里面为了不调用拷贝构造且不改变
	//就加上const和& 
	//const Date& d1, const Date& d2
	// 但是因为有this这个隐藏参数，就省略第一个
	//下面参数其实应该是
	//Date* const this     const Date& d
	bool operator==(const Date& d) {
		cout << "class" << endl;
		return _year == d._year    //左边省略了this 
			&& this->_month == d._month  //应该是 this->_year
			&& _day == d._day;
	}

	Date operator=(const Date& d) {
		this->_year = d._year;
		this->_month = d._month;
		this->_day = d._day;
		return *this;
	}

	void Print()
	{
		cout << _year << endl;
		cout << _month << endl;
		cout << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2018, 9, 28);
	Date d2(2018, 9, 26);
	//cout << d1.operator==(d2) << endl;
	//cout << (d1 == d2) << endl;
	Date d3=d1;
	d3.Print();
	Date d4;
	d4.operator=(d2);
	d4.Print();
	return 0;
}
